using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;

class PlayerInfo
{
    public int lev;
    public string name;
    public short atk;
    public bool sex;
}
public class Lesson13 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #region  知识点一 非字符串类型转字节数组
        //关键类:BitConverter
        //所在命名空间:System
        //主要作用:除字符串的其他常用类型和字节数组相互转换

        byte[] bytes = BitConverter.GetBytes(1.2f);
        #endregion

        #region  知识点二 字符串类型转字节数组
        //关键类:Encoding
        //所在命名空间:System.Text
        //主要作用:将字符串类型和字节数组相互转换 并且决定转换时使用的字符编码类型 在网络通信时建议使用UTF-8
        byte[] bytes1 = Encoding.UTF8.GetBytes("Hello World");
        #endregion

        #region  知识点三 如何将一个类对象转换为二进制
        //注意:网络通信中我们不能直接使用数据持久化2进制知识点中的
        //BinaryFormatter 2进制格式化类
        //因为客户端和服务器使用的语言可能不一样 BinaryFormatter是C#的序列化规则,和其他语言之间的兼容性不好
        //如果使用它 那么其他语言开发的服务器无法对其进行反序列化
        //我们需要自己来处理将类对象数据序列化为字节数组

        //单纯的转换一个变量字节数组非常的简单
        //但是我们如何将一个类对象携带的所有信息放入到一个字节数组中呢
        //我们需要做好以下几步
        //1.明确容量
        PlayerInfo pi = new PlayerInfo();
        pi.name = "张三";
        pi.atk = 100;
        pi.lev = 10;
        pi.sex = true;

        //得到的 这个Info数据 如果转换为字节数组 那么字节数组容器需要的容量
        int idnexNum = sizeof(int) +//lev int 4字节
        sizeof(short) +//atk short 2字节
        sizeof(int) +//name string 长度 4字节
        Encoding.UTF8.GetByteCount(pi.name) +//name string 字节数
        sizeof(bool);//sex bool 1字节
        //2.申明一个字节数组
        byte[] playerBytes = new byte[idnexNum];
        //3.将变量数据写入字节数组中 使用数组中的CopeTo方法转存数组
        //CopyTo方法的一二个参数代表 从容器的第几个位置去存储
        int index = 0;//从playerBytes的0位置开始存储

        //等级
        BitConverter.GetBytes(pi.lev).CopyTo(playerBytes, index);
        index += sizeof(int);
        //atk
        BitConverter.GetBytes(pi.atk).CopyTo(playerBytes, index);
        index += sizeof(short);
        //name  
        //获取长度
        BitConverter.GetBytes(pi.name.Length).CopyTo(playerBytes, index);
        index += sizeof(int);
        Encoding.UTF8.GetBytes(pi.name).CopyTo(playerBytes, index);
        index += pi.name.Length;
        //性别
        BitConverter.GetBytes(pi.sex).CopyTo(playerBytes, index);
        index += sizeof(bool);
        #endregion
    }

    // Update is called once per frame
    void Update()
    {

    }
}
